www.gusucode.com > VC++ 可自定义窗体模式(可以精简显示、隐藏菜单栏等)-源 > VC++ 可自定义窗体模式(可以精简显示、隐藏菜单栏等)-源码程序/code/MainFrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class // Download by http://www.NewXing.com #include "stdafx.h" #include "ViewModeSDI.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_COMMAND( IDI_TOOLBAR_EXIT , OnExit ) ON_COMMAND( IDI_TOOLBAR_NORMAL , OnNormal ) ON_COMMAND( IDI_TOOLBAR_SIMPLE , OnSimple ) ON_COMMAND( IDI_TOOLBAR_COMPACT, OnCompact ) ON_COMMAND( IDI_TOOLBAR_HELP , OnHelp ) ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_NORMAL, OnUpdateNormalUI ) ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_SIMPLE, OnUpdateSimpleUI ) ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_COMPACT, OnUpdateCompactUI ) //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here m_nViewMode = E_VIEWMODE_NORMAL; } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_menuMainWnd.LoadMenu( IDR_MAINFRAME ); if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if ( ! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || ! m_wndToolBar.LoadToolBar( IDR_TOOLBAR_BMP ) ) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } CImageList imageList; CBitmap bitmap; bitmap.LoadBitmap( IDR_TOOLBAR_BMP ); imageList.Create( 16, 16, ILC_COLORDDB, 5, 0 ); m_wndToolBar.GetToolBarCtrl().SetImageList( & imageList ); imageList.Detach(); bitmap.Detach(); m_wndToolBar.GetToolBarCtrl().SetButtonWidth( 72, 72 ); m_imageListToolBar.Create( 72, 72, ILC_COLOR32, 5, 0 ); m_imageListToolBar.SetBkColor( GetSysColor( COLOR_BTNFACE ) ); m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_EXIT ) ); m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_NORMAL ) ); m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_COMPACT ) ); m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_SIMPLE ) ); m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_HELP ) ); m_wndToolBar.GetToolBarCtrl().SetHotImageList( & m_imageListToolBar ); m_wndToolBar.GetToolBarCtrl().SetImageList( & m_imageListToolBar ); CRect rectToolBar; m_wndToolBar.GetItemRect( 0, & rectToolBar ); m_wndToolBar.SetSizes( rectToolBar.Size(), CSize( 72, 72 ) ); m_imageListToolBar.Detach(); if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY ); EnableDocking( CBRS_ALIGN_ANY ); DockControlBar( & m_wndToolBar ); GetWindowRect( & m_rectWindow ); GetClientRect( & m_rectClient ); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~FWS_ADDTOTITLE; cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX ); if ( cs.hMenu != NULL ) { DestroyMenu( cs.hMenu ); cs.hMenu = NULL; } if( ! CFrameWnd::PreCreateWindow( cs ) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnNormal() { m_nViewMode = E_VIEWMODE_NORMAL; ViewMode( m_nViewMode ); } void CMainFrame::OnUpdateNormalUI( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_NORMAL ); } void CMainFrame::OnSimple() { m_nViewMode = E_VIEWMODE_SIMPLE; ViewMode( m_nViewMode ); } void CMainFrame::OnUpdateSimpleUI( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_SIMPLE ); } void CMainFrame::OnCompact() { m_nViewMode = E_VIEWMODE_COMPACT; ViewMode( m_nViewMode ); } void CMainFrame::OnUpdateCompactUI( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_COMPACT ); } void CMainFrame::OnExit() { PostQuitMessage( NULL ); } void CMainFrame::OnHelp() { ( ( CViewModeSDIApp* ) AfxGetApp() )->OnAppAbout(); } VOID CMainFrame::ViewMode( INT nViewModeID ) { CRect rectWindow; CRect rectClient; CRect rectToolBar; CRect rectStatusBar; rectWindow = m_rectWindow; rectClient = m_rectClient; m_wndToolBar.GetWindowRect( & rectToolBar ); CStatusBar* pStatus = ( CStatusBar* ) AfxGetApp()->m_pMainWnd->GetDescendantWindow( AFX_IDW_STATUS_BAR ); pStatus->GetWindowRect( & rectStatusBar ); int nHeightBorder = GetSystemMetrics( SM_CYBORDER ); int nHeightCaption = GetSystemMetrics( SM_CYCAPTION ); int cx = 0; int cy = 0; switch ( nViewModeID ) { case E_VIEWMODE_NORMAL: SetMenu( & m_menuMainWnd ); pStatus->ShowWindow( SW_SHOW ); cx = rectWindow.Width(); cy = rectWindow.Height(); break; case E_VIEWMODE_SIMPLE: SetMenu( & m_menuMainWnd ); pStatus->ShowWindow( SW_HIDE ); cx = rectWindow.Width(); cy = rectWindow.Height() - rectClient.Height() + rectToolBar.Height() + nHeightCaption - nHeightBorder; break; case E_VIEWMODE_COMPACT: SetMenu( NULL ); pStatus->ShowWindow( SW_HIDE ); cx = rectWindow.Width(); cy = nHeightCaption + rectToolBar.Height() + nHeightBorder * 2; break; default: return; } SetWindowPos( & wndTop, rectWindow.left, rectWindow.top, cx, cy, SWP_SHOWWINDOW ); }